package top.malaoshi.webmvc.utils;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class FieldUtil {

    /**
     * 根据type类型获取该类的成员变量
     * @param clazz 当 object 是代理类对象时，必须传该值，否则无法获取有效的成员变量
     * @param object clazz类对象、或clazz代理类的对象
     * @param type 传入类型，可以是父类、接口
     * @return
     * @param <T>
     * @throws IllegalAccessException
     */
    public static <T> T[] getFieldsByType(Class clazz,Object object,Class<T> type) throws IllegalAccessException {
        List<T> retList = new ArrayList();
        // 当 object 是代理对象时，就必须通过 clazz获取类中的成员变量
        Field[] declaredFields = clazz.getDeclaredFields();
        for(Field field : declaredFields){
            field.setAccessible(true);
            T fieldObject = (T)field.get(object);
            if(type.isInstance(fieldObject)){
                retList.add(fieldObject);
            }
        }
        T[] retArr = (T[]) Array.newInstance(type, retList.size());
        return retList.toArray(retArr);
    }

}
